package cn.lcsjsxy.yxc.incommonuse.String;

import org.junit.jupiter.api.Test;
import cn.lcsjsxy.yxc.objectoriented.多态性.Person;

public class StringTest1 {
/*
* String的实例化方式
* 方式一：通过字面量定义的方式
* 方式二：通过new+构造器的方式
*
* 面试题：String s=new String(”abc“);方式创建对象，在内存中创建了几个对象？
*       两个：一个是堆空间中的new结构，一个是char[]对应的常量池中的数据"abc"
* */
    @Test
    public void test2(){
        //通过字面量定义的方式：此时的s1和s2的数据javaEE声明在方法区中的字符串常量池中
        String s1="javaEE";
        String s2="javaEE";
        //通过new+构造器的方式：此时的s3和s4保存的地址值，是数据在堆空间中开辟空间以后对应的地址值
        String s3=new String("javaEE");
        String s4=new String("javaEE");

        System.out.println(s1==s2);  //true
        System.out.println(s1==s3);  //false
        System.out.println(s1==s4);  //false
        System.out.println(s3==s4);  //false

        System.out.println("*****************************");
        Person p1=new Person("杨效晨",12);
        Person p2=new Person("杨效晨",12);
        System.out.println(p1.getName().equals(p2.getName()));  //true
        System.out.println(p1.getName()==p2.getName());  //true  因为在创建对象时，构造器中使用的其实是字面量定义的方式，所以两个”杨效晨“指向的是同一字符串池中的地址，故true
    }
}
